<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>新增异步遍历器简介</title>
  <style>
      div, li, p {
        line-height: 40px;
      }
      span {
        color: red;
      }
    </style>
</head>
<body>
  <h2>异步遍历器</h2>
  <ul>
    <li>
      前面我们直到。Iterator接口是一种数据遍历协议，只要调用遍历器对象的next方法就会得到一个对象，但是这里隐藏了一个规定，next方法是同步的，也就是说一旦调用了next()方法，就必须同步的得到value和done这两个属性。但是对于异步操作来说，这不是合适的
    </li>
    <li>
      异步遍历器最大的语法特点就是，调用遍历器的next方法返回的是一个Promise对象。
    </li>
    <li>
      我们直到，一个对象的同步遍历器的接口部署在Symbol.iterator属性上。同样的，对象的异步遍历器接口部署在Symbol.asyncIterator属性上面。<span>不管什么样的对象，只要它的Symbol.asyncIterator属性有值，就表示应该对它进行异步遍历而不是同步遍历</span>
    </li>
  </ul>

  <h2>for await ... of</h2>
  <ul>
    <li>
      前面介绍过，for...of循环用于遍历同步的Iterator接口。新引入的for await...of循环则用于遍历异步的Iterator接口
    </li>
    <li>
      for await...of方法会自动循环调用异步遍历器的next方法，并且返回一个Promise对象。await用来处理这个Promise对象，一旦resolve，就把得到的值（x）传入for...of循环体中
    </li>
    <li>
      如果next方法返回的Promsie对象被reject,for await...of就会报错，要用try...catch
    </li>
  </ul>

  <h2>异步Generator函数</h2>
  <ul>
    <li>
      就像Generator函数返回一个同步遍历器对象一样，异步Generator函数的作用是返回一个异步遍历器对象
    </li>
    <li>
      在语法上，异步Generator函数就是async函数与Generator相结合
    </li>
  </ul>
</body>
</html>